
#include "ModulePlayer.h"

void ModulePlayer::init(QCVModuleHandlerInterface * parent)
{
	win=new QWidget();
	pb_load=new QPushButton("Ouvrir",win);
	pb_webcam=new QPushButton("WebCam",win);	
	pb_play_pause=new QPushButton("Lecture",win);
		
	sb_periode=new QSpinBox(win);
	sb_periode->setRange(0,150);
	sb_periode->setValue(30);
	sb_periode->setPrefix("periode=");	

	progress_bar=new QProgressBar();
	vlayout=new QVBoxLayout(win);
	layout=new QHBoxLayout();
	layout->addWidget(pb_load);
	layout->addWidget(pb_webcam);	
	layout->addWidget(pb_play_pause);
	vlayout->addLayout(layout);
	vlayout->addWidget(sb_periode);
	vlayout->addWidget(progress_bar);

	connect(pb_load,SIGNAL(clicked()),this,SLOT(load()));
	connect(pb_play_pause,SIGNAL(clicked()),this,SLOT(start_stop()));
	connect(pb_webcam,SIGNAL(clicked()),this,SLOT(loadFromWebCam()));
	
	timer=new QTimer(this);
	connect(timer, SIGNAL(timeout()), this, SLOT(get_frame()));
	connect(sb_periode,SIGNAL(valueChanged(int)),this,SLOT(setTimerPeriod(int)));	

	if(parent!=NULL){this->parent=parent;}else{QMessageBox::critical(NULL,"Erreur","parent null!");}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::get_frame()
{
			
	cap>>frame;
	if(!frame.empty())
	{				
		cvtColor(frame, frame, CV_RGB2BGR);			
		parent->forceOutput(frame);	
	}
	else
	{
		timer->stop();
		pb_play_pause->setText("Lecture");
		cap.set(CV_CAP_PROP_POS_FRAMES,0);
	}
	
	progress_bar->setValue(cap.get(CV_CAP_PROP_POS_FRAMES));
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::free()
{
	timer->stop();
	cap.release();
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModulePlayer::process()
{

}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::setInput(int n,const cv::Mat & m)
{

}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModulePlayer::widget()
{
  return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlayer::getName()
{
  return trUtf8("Lecteur Vidéo");
}
////////////////////////////////////////////////////////////////////////////////
int ModulePlayer::nbInputs()
{
  return 0;
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlayer::getParams()
{
	return QString::number(sb_periode->value());
}
bool ModulePlayer::setParams(QString params)
{
	QStringList params_list=params.split(";");
	
	if(params_list.size()==1)
	{
		sb_periode->setValue(params_list[0].toInt());
		
		return true;
	}
	else
	{
		return false;
	}
}
////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModulePlayer::clone()
{
	return new ModulePlayer;
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlayer::help(int id)
{
	if(id==-2)
	{
		 return tr("Module permettant de lire des images, des videos ou encore récuperer le flux d'une webcam.");
	}	
	else if(id==-1)
	{
		 return tr("image");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::setTimerPeriod(int p)
{ 
	timer->setInterval(p);
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::start_stop()
{
  if(timer->isActive())
  {
    timer->stop();
    pb_play_pause->setText("Lecture");
  }
  else
  {
    timer->start(sb_periode->value());
    pb_play_pause->setText("Pause");
  }
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::load()
{	  
	QString filename=QFileDialog::getOpenFileName(NULL,tr("Ouvrir une video"),"videos",tr("Tous (*.*)"));
	if(!filename.isEmpty())
	{
		if(cap.isOpened())
		{
			cap.release();
		}
		if(cap.open(filename.toAscii().data()))
		{
			progress_bar->setRange(0,cap.get(CV_CAP_PROP_FRAME_COUNT));
		}  
		else
		{
			QMessageBox::information(NULL,"Erreur","Impossible d'ouvrir le fichier");
		}	
		if(timer->isActive())
		{
		  timer->stop();
		  pb_play_pause->setText("Lecture");
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlayer::loadFromWebCam()
{
	bool ok=false;
	int n=QInputDialog::getInt(NULL, trUtf8("Numéro de caméra"),trUtf8("Numéro de caméra"), 0, -1, 10, 1, &ok);

	if(ok)
	{
		if(cap.isOpened())
		{
			cap.release();
		}
		if(cap.open(n))
		{
			progress_bar->setRange(0,-1);
		}
		else
		{
			QMessageBox::information(NULL,"Erreur","Impossible de trouver la webcam");
		}
		if(timer->isActive())
		{
			timer->stop();
			pb_play_pause->setText("Lecture");
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModulePlayer_plugin,ModulePlayer);
